﻿// todo
// игнорировать имена собственные начинающиеся с большой буквы
// замена апострафа в конце слова на -о, апостраф в середине не менять, может быть имя собственное
// замена "l'" на "la"
// большинство междометий могут записываться по несколько раз через дефис (ta-ta-ta, nu-nu)
// warnings:
//   более 3х суффиксов подряд
//   более 3х корней в слове


#include "../other/utf8reader/stxutif.h"
#include <string>
#include <vector>
#include <map>
#include <set>
#include <fstream>

using namespace std;






/*
?????????????????
суф  op on retro pra
прист dis mis

    ĉi-tiea
    ĉiamulo
    L"iomete"
    //ambaŭ, - в списке слов есть, но часть речи не известна (сущ.)

? Kabe Ĝingis TTT
?????????????????
*/



/*
//         pronomo nombro
enum bazoParto
{
  O_VORTO, //  +     +
  A_VORTO, //  +     +
  I_VORTO, //
  E_VORTO, //       ++
  N_VORTO, //        +
  KONJ,
  PREP,
  INTERJECTIO,
  LA
};

enum adds
{
  AKUZATIVO,
  PLURALO,
  GENRO_M,
  GENRO_IN,
  GENRO_NESCIA
};

enum tempo
{
  TEMPO_NESCIA,
  TEMPO_I,
  TEMPO_A,
  TEMPO_O,
};
*/


enum vortforado // участие в словообразовании
{
  VF_PRE  = 0x10000, // preskribo приставка
  VF_SUF  = 0x20000, // sufikso
  VF_FIN  = 0x30000, // finajho
  VF_RAD  = 0x40000, // radiks
  VF_VORO = 0x50000, // vorto слово применяется только в неизменном виде (например артикль)
}

enum parolparto // часть речи или слова
{
  PP_ARTIKOLO    = 50000, // артикль
  PP_PRONOMO     = 50100, // местоимение
  PP_ITBL        = 50200, // табличное слово i-
  PP_KTBL        = 50300, // табличное слово ki-
  PP_TTBL        = 50400, // табличное слово ti-
  PP_CTBL        = 50500, // табличное слово ĉi-
  PP_NTBL        = 50600, // табличное слово neni-
  PP_PARTIKULO   = 50700, // частица
  PP_NUMERALO    = 50800, // числительное
  PP_ADVERBO     = 50900, // наречие
  PP_KONJUNKCIO  = 51000, // союз
  PP_PREPOZICIO  = 51100, // предлог
  PP_INTERJEKCIO = 51200, // междометие
  PP_PRESKRIBO   = 51300, // приставка
  PP_SUFIKSO     = 51400, // суффикс
  PP_FINAJHO     = 51500, // окончание
  PP_NJ          = 51600, // окончание -n или -j
};


struct {
  const wchar_t * txt;
  size_t flags;
} preVortaro[] = 
{
  // артикль
  L"la",                PP_ARTIKOLO,

  // частицы и специальные слова
  L"ĉu",                PP_PARTIKULO | 0,// ли (вопросительная частица)
  L"ĉi",       VF_PRE | PP_PARTIKULO | 1, // обозначает близость, может использоваться в качестве приставки
  L"ajn",      VF_RAD | PP_PARTIKULO | 2,
  L"ne",       VF_RAD | PP_PARTIKULO | 3,
  L"jes",      VF_RAD | PP_PARTIKULO | 4,
  L"minus",    VF_RAD | PP_PARTIKULO | 5,
  L"plus",     VF_RAD | PP_PARTIKULO | 6,

   // местоимения, участвуют в словообразовании
  L"mi",       VF_RAD | PP_PRONOMO | 0, 
  L"vi",       VF_RAD | PP_PRONOMO | 1, 
  L"ci",       VF_RAD | PP_PRONOMO | 2, 
  L"ni",       VF_RAD | PP_PRONOMO | 3, 
  L"ĝi",       VF_RAD | PP_PRONOMO | 4, 
  L"ŝi",       VF_RAD | PP_PRONOMO | 5, 
  L"li",       VF_RAD | PP_PRONOMO | 6, 
  L"ili",      VF_RAD | PP_PRONOMO | 7, 
  L"si",       VF_RAD | PP_PRONOMO | 8, 
  L"oni",      VF_RAD | PP_PRONOMO | 9,    // может принимать окончание -n
  L"mem",      VF_RAD | PP_PRONOMO | 10,   // не изменяется, может быть корнем (mem•far•it•a)

  // табличные слова участвуют с словообразовании
  // _CHI - может соседствовать с "ĉi"
  // ajn - испоьзуется с вопросительными и неопределенными (kia & ia)
  L"ia",       VF_RAD | PP_ITBL | 1,
  L"ial",      VF_RAD | PP_ITBL | 2,
  L"iam",      VF_RAD | PP_ITBL | 3,
  L"ie",       VF_RAD | PP_ITBL | 4,
  L"ien",      VF_RAD | PP_ITBL | 5,
  L"iel",      VF_RAD | PP_ITBL | 6,
  L"ies",      VF_RAD | PP_ITBL | 7,
  L"io",       VF_RAD | PP_ITBL | 8,
  L"iom",      VF_RAD | PP_ITBL | 9,
  L"iu",       VF_RAD | PP_ITBL | 10,
  L"kia",      VF_RAD | PP_KTBL | 11,
  L"kial",     VF_RAD | PP_KTBL | 12,
  L"kiam",     VF_RAD | PP_KTBL | 13,
  L"kie",      VF_RAD | PP_KTBL | 14,
  L"kien",     VF_RAD | PP_KTBL | 15,
  L"kiel",     VF_RAD | PP_KTBL | 16,
  L"kies",     VF_RAD | PP_KTBL | 17,
  L"kio",      VF_RAD | PP_KTBL | 18,
  L"kiom ",    VF_RAD | PP_KTBL | 19,
  L"kiu",      VF_RAD | PP_KTBL | 20,
  L"kiomope",  VF_RAD | PP_KTBL | 21,
  L"tia",      VF_RAD | PP_TTBL | 22,
  L"tial",     VF_RAD | PP_TTBL | 23,
  L"tiam",     VF_RAD | PP_TTBL | 24,
  L"tie",      VF_RAD | PP_TTBL | 25,
  L"tien",     VF_RAD | PP_TTBL | 26,
  L"tiel",     VF_RAD | PP_TTBL | 27,
  L"ties",     VF_RAD | PP_TTBL | 28,
  L"tio",      VF_RAD | PP_TTBL | 29,
  L"tion",     VF_RAD | PP_TTBL | 30,
  L"tiom",     VF_RAD | PP_TTBL | 31,
  L"tiu",      VF_RAD | PP_TTBL | 32,
  L"tiun",     VF_RAD | PP_TTBL | 33,
  L"ĉia",      VF_RAD | PP_CTBL | 34,
  L"ĉial",     VF_RAD | PP_CTBL | 35,
  L"ĉiam",     VF_RAD | PP_CTBL | 36,
  L"ĉie",      VF_RAD | PP_CTBL | 37,
  L"ĉiel",     VF_RAD | PP_CTBL | 38,
  L"ĉies",     VF_RAD | PP_CTBL | 39,
  L"ĉio",      VF_RAD | PP_CTBL | 40,
  L"ĉiom",     VF_RAD | PP_CTBL | 41,
  L"ĉiu",      VF_RAD | PP_CTBL | 42,
  L"nenia",    VF_RAD | PP_NTBL | 43,
  L"nenial",   VF_RAD | PP_NTBL | 44,
  L"neniam",   VF_RAD | PP_NTBL | 45,
  L"nenie",    VF_RAD | PP_NTBL | 46,
  L"neniel",   VF_RAD | PP_NTBL | 47,
  L"nenies",   VF_RAD | PP_NTBL | 48,
  L"neniom",   VF_RAD | PP_NTBL | 49,
  L"neniu",    VF_RAD | PP_NTBL | 50,

  // Числительные, могут быть корнями
  L"nul",      VF_RAD | PP_NUMERALO | 0,
  L"unu",      VF_RAD | PP_NUMERALO | 1,
  L"du",       VF_RAD | PP_NUMERALO | 2,
  L"tri",      VF_RAD | PP_NUMERALO | 3,
  L"kvar",     VF_RAD | PP_NUMERALO | 4,
  L"kvin",     VF_RAD | PP_NUMERALO | 5,
  L"ses",      VF_RAD | PP_NUMERALO | 6,
  L"sep",      VF_RAD | PP_NUMERALO | 7,
  L"ok",       VF_RAD | PP_NUMERALO | 8,
  L"naŭ",      VF_RAD | PP_NUMERALO | 9,
  L"dek",      VF_RAD | PP_NUMERALO | 10,
  L"cent",     VF_RAD | PP_NUMERALO | 11,
  L"mil",      VF_RAD | PP_NUMERALO | 12,
  L"milion",   VF_RAD | PP_NUMERALO | 13,
  L"miliard",  VF_RAD | PP_NUMERALO | 14,
  L"bilion"    VF_RAD | PP_NUMERALO | 15,

  // Наречия, могут быть корнями
  L"ankoraŭ",  VF_RAD | PP_ADVERBO | 0, // все еще, опять
  L"almenaŭ",  VF_RAD | PP_ADVERBO | 1, // по крайней мере
  L"apenaŭ",   VF_RAD | PP_ADVERBO | 2, // едва, еле, только лишь
  L"baldaŭ",   VF_RAD | PP_ADVERBO | 3, // скоро, вскоре
  L"eĉ",       VF_RAD | PP_ADVERBO | 4, // даже
  L"for",      VF_RAD | PP_ADVERBO | 5, // прочь
  L"jam",      VF_RAD | PP_ADVERBO | 6, // уже
  L"jen",      VF_RAD | PP_ADVERBO | 7, // вот
  L"ĵus",      VF_RAD | PP_ADVERBO | 8, // только что
  L"hieraŭ",   VF_RAD | PP_ADVERBO | 9, // вчера
  L"hodiaŭ",   VF_RAD | PP_ADVERBO | 10, // сегодня
  L"morgaŭ",   VF_RAD | PP_ADVERBO | 11, // завтра
  L"nun",      VF_RAD | PP_ADVERBO | 12, // теперь
  L"nur",      VF_RAD | PP_ADVERBO | 13, // только
  L"preskaaŭ", VF_RAD | PP_ADVERBO | 14, // почти
  L"plu",      VF_RAD | PP_ADVERBO | 15, // далее
  L"tre",      VF_RAD | PP_ADVERBO | 16, // очень
  L"tro",      VF_RAD | PP_ADVERBO | 17, // слишком
  L"tuj",      VF_RAD | PP_ADVERBO | 18, // тотчас, сразу
  L"pli",      VF_RAD | PP_ADVERBO | 19, // более
  L"plej",     VF_RAD | PP_ADVERBO | 20, // наиболее

  // союзы НЕ участвуют в словообразовании
  L"kaj",               PP_KONJUNKCIO | 0, // и, а, да; 
  L"sed",               PP_KONJUNKCIO | 1, // но, а; 
  L"aŭ",                PP_KONJUNKCIO | 2, // или; 
  L"ĉar",               PP_KONJUNKCIO | 3, // потому что, так как, ибо; 
  L"do",                PP_KONJUNKCIO | 4, // же, итак, следовательно; 
  L"ja",                PP_KONJUNKCIO | 5, // ведь, же;        (? частица или союз)
  L"ke",                PP_KONJUNKCIO | 6, // cоединительный союз типа русского "что"; 
  L"kvankam",           PP_KONJUNKCIO | 7, // хотя; 
  L"kvazaŭ",            PP_KONJUNKCIO | 8, // как будто, как бы; 
  L"se",                PP_KONJUNKCIO | 9, // если; 
  L"tamen",             PP_KONJUNKCIO | 10, // однако, все-таки.
  L"ankaŭ",             PP_KONJUNKCIO | 11, // также (? возможно и наречие)
  L"nek",               PP_KONJUNKCIO | 12, // nek... nek... - ни... ни...
  L"ju",                PP_KONJUNKCIO | 13, // ju...  des...
  L"des",               PP_KONJUNKCIO | 14, // чем... тем...
  L"ol",                PP_KONJUNKCIO | 15, // pli ... ol... - более... чем...

  // Предлоги, могут быть корнями
  L"al",       VF_RAD | PP_PREPOZICIO | 0,  // к
  L"anstataŭ", VF_RAD | PP_PREPOZICIO | 1,  // вместо
  L"antaŭ",    VF_RAD | PP_PREPOZICIO | 2,  // перед
  L"apud",     VF_RAD | PP_PREPOZICIO | 3,  // возле, около
  L"ĉe",       VF_RAD | PP_PREPOZICIO | 4,  // у, при
  L"ĉirkaŭ",   VF_RAD | PP_PREPOZICIO | 5,  // вокруг
  L"da",       VF_RAD | PP_PREPOZICIO | 6,  // ставится между числом и мерой веса, объема и т. д.
  L"de",       VF_RAD | PP_PREPOZICIO | 7,  // от, +отношение родительного падежа
  L"dum",      VF_RAD | PP_PREPOZICIO | 8,  // пока, в течение, в продолжение
  L"ekster",   VF_RAD | PP_PREPOZICIO | 9,  // вне, за пределами
  L"el",       VF_RAD | PP_PREPOZICIO | 10, // из
  L"en",       VF_RAD | PP_PREPOZICIO | 11, // в
  L"ĝis",      VF_RAD | PP_PREPOZICIO | 12, // до
  L"inter",    VF_RAD | PP_PREPOZICIO | 13, // между
  L"je",       VF_RAD | PP_PREPOZICIO | 14, // непереводимый универсальный предлог
  L"kontraŭ",  VF_RAD | PP_PREPOZICIO | 15, // против
  L"krom",     VF_RAD | PP_PREPOZICIO | 16, // кроме
  L"kun",      VF_RAD | PP_PREPOZICIO | 17, // с
  L"laŭ",      VF_RAD | PP_PREPOZICIO | 18, // согласно, по
  L"malgraŭ",  VF_RAD | PP_PREPOZICIO | 19, // несмотря на
  L"per",      VF_RAD | PP_PREPOZICIO | 20, // посредством
  L"po",       VF_RAD | PP_PREPOZICIO | 21, // по (при числительных)
  L"por",      VF_RAD | PP_PREPOZICIO | 22, // для
  L"post",     VF_RAD | PP_PREPOZICIO | 23, // после, позади, за
  L"preter",   VF_RAD | PP_PREPOZICIO | 24, // мимо
  L"pri",      VF_RAD | PP_PREPOZICIO | 25, // о, об
  L"pro",      VF_RAD | PP_PREPOZICIO | 26, // из-за, ради
  L"sen",      VF_RAD | PP_PREPOZICIO | 27, // без
  L"sub",      VF_RAD | PP_PREPOZICIO | 28, // под
  L"super",    VF_RAD | PP_PREPOZICIO | 29, // над, сверху
  L"sur",      VF_RAD | PP_PREPOZICIO | 30, // на
  L"tra",      VF_RAD | PP_PREPOZICIO | 31, // сквозь
  L"trans",    VF_RAD | PP_PREPOZICIO | 32, // через
  L"estiel",   VF_RAD | PP_PREPOZICIO | 33, // как 

   // междометия, некоторые могут участвовать в словообразовании (bis)
  L"ve",                PP_INTERJEKCIO | 0,  // увы
  L"tin",               PP_INTERJEKCIO | 1,  // динь(-динь)
  L"ta",                PP_INTERJEKCIO | 2,  // та-та-та
  L"dirlididi",         PP_INTERJEKCIO | 3,  
  L"bum",               PP_INTERJEKCIO | 4,  // бум
  L"pum",               PP_INTERJEKCIO | 5,  // бум
  L"pa",                PP_INTERJEKCIO | 6,  // огорчение, досада
  L"nu",                PP_INTERJEKCIO | 7,  // ну * или греческая буква
  L"ĉit",               PP_INTERJEKCIO | 8,  
  L"ts",                PP_INTERJEKCIO | 9,  // тсс
  L"hura",              PP_INTERJEKCIO | 10, // ура
  L"amen",              PP_INTERJEKCIO | 11, // аминь
  L"haleluja",          PP_INTERJEKCIO | 12, // алилуя
  L"aj",                PP_INTERJEKCIO | 13, // ай
  L"oj",                PP_INTERJEKCIO | 14, 
  L"hm",                PP_INTERJEKCIO | 15, // хм
  L"ho",                PP_INTERJEKCIO | 16, // ох
  L"aĥ",                PP_INTERJEKCIO | 17, 
  L"hop",               PP_INTERJEKCIO | 18, // гоп
  L"fu",                PP_INTERJEKCIO | 19,  
  L"hu",                PP_INTERJEKCIO | 20, // фу
  L"hej",               PP_INTERJEKCIO | 21, 
  L"he",                PP_INTERJEKCIO | 22, // эй
  L"hola",              PP_INTERJEKCIO | 23, // эй, алло
  L"adiaŭ",             PP_INTERJEKCIO | 24, // прощай
  L"hot",               PP_INTERJEKCIO | 25, 
  L"hoto",              PP_INTERJEKCIO | 26, 
  L"huj",               PP_INTERJEKCIO | 27, 
  L"ups",               PP_INTERJEKCIO | 28, 
  L"baf",               PP_INTERJEKCIO | 29, 
  L"ba",                PP_INTERJEKCIO | 30, 
  L"bis",      VF_RAD | PP_INTERJEKCIO | 31, // бис
  L"ha",                PP_INTERJEKCIO | 32, 
  L"ŝŝ",                PP_INTERJEKCIO | 33, 
  L"ŭoŭ",               PP_INTERJEKCIO | 34, 
  L"baŭ",               PP_INTERJEKCIO | 35, // гав
  L"vaŭ",               PP_INTERJEKCIO | 36, // гав
  L"miaŭ",              PP_INTERJEKCIO | 37,
  L"aha",               PP_INTERJEKCIO | 38,
  L"ehe"                PP_INTERJEKCIO | 39,

  // приставки (могут быть корнями)
  L"re",       VF_PRE | PP_PRESKRIBO | 0, 
  L"dis",      VF_PRE | PP_PRESKRIBO | 1, 
  L"eks",      VF_PRE | PP_PRESKRIBO | 2, 
  L"pra",      VF_PRE | PP_PRESKRIBO | 3, 
  L"mis",      VF_PRE | PP_PRESKRIBO | 4, 
  L"mal",      VF_PRE | PP_PRESKRIBO | 5, 
  L"ek",       VF_PRE | PP_PRESKRIBO | 6, 
  L"ge",       VF_PRE | PP_PRESKRIBO | 7, 
  L"bo",       VF_PRE | PP_PRESKRIBO | 8, 
  L"fi",       VF_PRE | PP_PRESKRIBO | 9, 
  L"for",      VF_PRE | PP_PRESKRIBO | 10, // эта и далее "неофициальные" приставки
  L"retro",    VF_PRE | PP_PRESKRIBO | 11,
  L"arĥ",      VF_PRE | PP_PRESKRIBO | 12, // "псевдоприставка научно-технического языка"
  L"arĥi",     VF_PRE | PP_PRESKRIBO | 13, // "приставка научно-технической терминологии"
  L"ark",      VF_PRE | PP_PRESKRIBO | 14, // = arĥ.

  // Словообразующие официальные суффиксы
  L"ac",       VF_SUF | PP_SUFIKSO | 0, // офц?
  L"aĉ",       VF_SUF | PP_SUFIKSO | 1, 
  L"ad",       VF_SUF | PP_SUFIKSO | 2, 
  L"aĵ",       VF_SUF | PP_SUFIKSO | 3, 
  L"an",       VF_SUF | PP_SUFIKSO | 4, 
  L"ar",       VF_SUF | PP_SUFIKSO | 5, 
  L"ebl",      VF_SUF | PP_SUFIKSO | 6, 
  L"ec",       VF_SUF | PP_SUFIKSO | 7, 
  L"eg",       VF_SUF | PP_SUFIKSO | 8, 
  L"ej",       VF_SUF | PP_SUFIKSO | 9, 
  L"em",       VF_SUF | PP_SUFIKSO | 10,
  L"end",      VF_SUF | PP_SUFIKSO | 11, // офц?
  L"er",       VF_SUF | PP_SUFIKSO | 12, 
  L"estr",     VF_SUF | PP_SUFIKSO | 13, // офц?
  L"et",       VF_SUF | PP_SUFIKSO | 14, 
  L"id",       VF_SUF | PP_SUFIKSO | 15, 
  L"ig",       VF_SUF | PP_SUFIKSO | 16, 
  L"iĝ",       VF_SUF | PP_SUFIKSO | 17, 
  L"il",       VF_SUF | PP_SUFIKSO | 18, 
  L"in",       VF_SUF | PP_SUFIKSO | 19, 
  L"ind",      VF_SUF | PP_SUFIKSO | 20, 
  L"ing",      VF_SUF | PP_SUFIKSO | 21,
  L"ism",      VF_SUF | PP_SUFIKSO | 22,
  L"ist",      VF_SUF | PP_SUFIKSO | 23,
  L"obl",      VF_SUF | PP_SUFIKSO | 24, //      не только с числительными (например multobligi увеличить во много раз)
  L"on",       VF_SUF | PP_SUFIKSO | 25,
  L"op",       VF_SUF | PP_SUFIKSO | 26,
  L"uj",       VF_SUF | PP_SUFIKSO | 27,
  L"ul",       VF_SUF | PP_SUFIKSO | 28,
  L"um",       VF_SUF | PP_SUFIKSO | 29,
// L"ĉj",  // присоединяется к усечённому корню, пока не учитывается
// L"nj",  //  присоединяется к усечённому корню

  // суффиксы причастия/деепричастия
  L"it",       VF_SUF | PP_SUFIKSO | 32, 
  L"at",       VF_SUF | PP_SUFIKSO | 33, 
  L"ot",       VF_SUF | PP_SUFIKSO | 34, 
  L"int",      VF_SUF | PP_SUFIKSO | 35, 
  L"ant",      VF_SUF | PP_SUFIKSO | 36, 
  L"ont",      VF_SUF | PP_SUFIKSO | 37, 


  // окончания (могут использоваться дважды, например viv•u•o)
  L"o",        VF_FIN | PP_FINAJHO | 0,
  L"a",        VF_FIN | PP_FINAJHO | 1,
  L"e",        VF_FIN | PP_FINAJHO | 2,
  L"i",        VF_FIN | PP_FINAJHO | 3,
  L"is",       VF_FIN | PP_FINAJHO | 4,
  L"as",       VF_FIN | PP_FINAJHO | 5,
  L"os",       VF_FIN | PP_FINAJHO | 6,
  L"u",        VF_FIN | PP_FINAJHO | 7,
  L"us",       VF_FIN | PP_FINAJHO | 8,
  // окончательные окончания  (только в конце слова)
  L"n"         VF_FIN | PP_NJ | 0,              // ??? malsupreniros, mal•supr•e•n•iĝ•i
  L"j",        VF_FIN | PP_NJ | 1,
};










typedef map<wstring, size_t> wmap_t;
wmap_t wmap;


void addRoots()
{
  for (size_t i=0; i<sizeof(preVortaro)/sizeof(*preVortaro); i++)
  {
    wmap[preVortaro[i].txt] = preVortaro[i].flags;
  }
}

void readRoots(const wchar_t *fileName)
{
  // чтение utf8 файла с помощью wifstream: http://www.codeproject.com/Articles/38242/Reading-UTF-8-with-C-streams
  wifstream ifs ( fileName , wifstream::in );
  ifs.imbue(gel::stdx::utf8_locale);

  size_t rootIndex = 1;
  while (ifs.good())
  {
    wchar_t buf[256];
    ifs.getline(buf, 256);

    if (!buf[0])
      continue;

    // не загружать уже добавленые в список предопределенные слова (корни)
    auto it = wmap.find(buf);
    if (it == wmap.end())
      continue;

    wmap[buf] = rootIndex++;
  }
  ifs.close();
}

vector<wstring> words;
void readWords(const wchar_t *fileName)
{
  wifstream ifs ( fileName , wifstream::in );
  ifs.imbue(gel::stdx::utf8_locale);

  while (ifs.good())
  {
    wchar_t buf[256];
    ifs.getline(buf, 256);
    if (buf[0])
      words.push_back(buf);
  }
  ifs.close();
}








/*
struct vorto
{
  vector<size_t> roots;
  vector<finajho> ends;
};


bool testEndings(const wstring &txt, vorto& word)
{
  // окончание должно быть т.к. в списке корней только корни имевшие окончания,
  // корни без окончания в списке простых слов
  _ASSERT(!txt.empty());

  const static wstring endlist[] = {
    L"is", L"as", L"os", L"us", L"u",
    L"o",
    L"a",
    L"i",
    L"e",
    L"j",
    L"n"
  };

  for (size_t i=0; i<sizeof(endlist)/sizeof(*endlist); i++)
  {
    const wstring &end = endlist[i];
    if (txt.compare(0, end.length(), end) == 0)
    {
      word.ends.push_back(static_cast<finajho>(i));
      if (txt.length() == end.length())
        return true;
      else
        return testEndings(txt.substr(end.length()), word);
    }
  }
  return false;
}

bool testSyntezedWord(const wstring &txt, vorto& word)
{
  size_t rootIndex = 1;
  for (auto it=roots.begin(); it!=roots.end(); ++it, ++rootIndex)
  {
    const wstring &s = *it;
    if (txt.length() >= s.length())
    {
      if (txt.compare(0, s.length(), s) == 0)
      {
        word.roots.push_back(rootIndex);

        wstring &txt1 = txt.substr(s.length());
        if (testEndings(txt1, word))
          return true;
        
        if (testSyntezedWord(txt1, word))
          return true;

        if (txt1[0] == 'o') // todo: окончание может быть любым
        {
          txt1 = txt1.substr(1);
          if (testSyntezedWord(txt1, word))
            return true;
        }

      }
    }
  }

  return !word.roots.empty();
}
*/

typedef vector<size_t> vorto;
typedef vector<vorto> vortlist;

void disMuntu(const wstring &txt, const vorto &currWord, vortlist &vortoj)
{
  vortlist wlst;
  for (auto it=wmap.begin(); it!=wmap.end(); ++it)
  {
    const wstring &s = (*it).first;
    if (txt.compare(0, s.length(), s) == 0)
    {
      vorto nw = currWord;
      wlst.push_back(it->second);
    }
  }
}

int main(int argc, char *argv[])
{

  addRoots();
  readRoots(L"E:\\sendoj\\eogram\\revo\\roots.txt");

  vorto word;
//  testSyntezedWord(L"terpomo", word);
//  testSyntezedWord(L"troabundeco", word);
  

  readWords(L"E:\\sendoj\\eogram\\revo\\derivajxoj.txt");

  for (auto it=words.begin(); it!=words.end(); ++it)
  {
    wstring &s = *it;
    vorto word;
//    if (!testSimpleWord(s) && !testSyntezedWord(s, word))
//    {
//      word.ends.clear();
//    }
  }

  return 1;
 }

